import os.path
import subprocess

# import wget
import urllib.request
import urllib3

normal_pre_package = ['gcc-c++', 'zlib*', 'libffi-devel']   # 安装前置包


class NormalMethod:
    def __init__(self, version, PBMworkdir):
        self.version = version # 3.7.0
        self.softname = 'Python-{}'.format(self.version) # Python-3.7.0
        self.PBMwork_dir = PBMworkdir   # /tmp/PBMwork/


    @staticmethod
    def runcmd(command):    # linux命令通过该函数运行
        print('Notice：执行命令 —— CMD={}'.format(command))
        p = subprocess.Popen(command, shell=True)
        p.wait()
        if p.returncode == 0:
            print('Notice：命令执行成功 —— CMD={}'.format(command))
        else:
            print('!!!!Error：执行失败 —— CMD={}'.format(command))

    def download(self): # 下载源码包
        print('====> 下载python包')
        url = 'https://www.python.org/ftp/python/{}/{}.tar.xz'.format(self.version, self.softname)
        dest = self.PBMwork_dir + '/{}.tar.xz'.format(self.softname)
        print('Notice：正在下载 —— URL={}'.format(url))
        urllib.request.urlretrieve(url, dest)   # 下载Python-3.7.0.tar.xz到/tmp/PBMwork/下
        print('Notice：下载完成 —— PATH={}'.format(dest))

    def pre_install(self):  # 前置：安装需要的环境
        print('====> 安装需要的环境包')
        packagelist = ' '.join(normal_pre_package)
        command = 'yum -y install {}'.format(packagelist)
        self.runcmd(command)

    def write_install(self):  # 主安装过程
        print('====> 写入安装脚本')
        normal_text = [
            'tar -xvf {} -C {}'.format(self.PBMwork_dir + '{}.tar.xz'.format(self.softname), self.PBMwork_dir),
            'cd {}'.format(self.PBMwork_dir + self.softname),
            'pwd',
            './configure --prefix={}'.format(self.PBMwork_dir),
            'make && make install',
            'rm -rf /usr/bin/python3',
            'rm -rf /usr/bin/pip3',
            'ln -s {}/bin/python3 /usr/bin/python3'.format(self.PBMwork_dir),
            'ln -s {}/bin/pip3 /usr/bin/pip3'.format(self.PBMwork_dir)
            ]
        f = open(self.PBMwork_dir + 'install.sh', 'a', encoding='utf-8')
        for text in normal_text:
            f.write(text + '\n')
        f.close()
        print('Notice：安装脚本写入完成 —— PATH={}'.format(self.PBMwork_dir + '/install.sh'))

    def install(self):
        self.download()
        self.pre_install()
        self.write_install()
        print('====> 开始安装')
        self.runcmd('bash {}'.format(self.PBMwork_dir + 'install.sh'))

    def check(self):    # 安装结果查看，判断是否符合要求
        print('====> 检查方法')
        print('python3 -V')
        print('pip3 -V')

    def __call__(self): # 主入口。用来启动测试过程
        print('--------  This is normal_method  --------')
        self.install()
        self.check()
